#include "mysql.h"

MySQL *MySQL::mySQL = nullptr;

MySQL::MySQL()
{
    // 链接数据库驱动
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("face.db");
    db.open();
}

MySQL *MySQL::getMySQL()
{
    if(mySQL == nullptr){
        mySQL = new MySQL;
    }

    return mySQL;
}

MySQL::~MySQL()
{
    db.close();
    // 避免重复删除
    if (mySQL) {
        delete mySQL;
        mySQL = nullptr;
    }
}

// 创建表格的函数
void MySQL::createTable()
{
    QString sql = "CREATE TABLE IF NOT EXISTS students ("
                  "id INTEGER PRIMARY KEY, "
                  "name TEXT, "
                  "start_time DATETIME, "
                  "end_time DATETIME)";
    QSqlQuery query;
    if(!query.exec(sql)){
        qDebug("创建失败");
    }
}

// 向表格中插入学号姓名和进入教室的时间
void MySQL::insertStudent(QString id, QString name)
{
    QSqlQuery query;
    // 避免 SQL 注入，使用参数化查询
    QString insert_sql = "INSERT INTO students(id, name, start_time) VALUES (:id, :name, datetime('now', 'localtime'))";
    query.prepare(insert_sql);
    bool ok;
    int intId = id.toInt(&ok);
    if (ok) {
        query.bindValue(":id", QVariant(intId));
    } else {
        qDebug() << "ID 转换为整数失败，ID: " << id;
        return;
    }
    query.bindValue(":name", name);
    if(!query.exec()){
        qDebug() << "数据插入失败，错误信息: " << query.lastError().text();
    } else {
        qDebug("数据插入成功");
    }
}

// 通过id找到学生姓名
QString MySQL::getNameById(QString id)
{
    QSqlQuery query;
    QString select_sql = "SELECT name FROM students WHERE id = :id";
    query.prepare(select_sql);
    bool ok;
    int intId = id.toInt(&ok);
    if (ok) {
        query.bindValue(":id", QVariant(intId));
    } else {
        qDebug() << "ID 转换为整数失败，ID: " << id;
        return "";
    }

    if (query.exec()) {
        if (query.next()) {
            // 获取查询结果中的姓名
            QString name = query.value(0).toString();
            return name;
        } else {
            qDebug() << "未找到对应的学生记录，ID: " << id;
        }
    } else {
        qDebug() << "查询失败，错误信息: " << query.lastError().text();
    }

    return ""; // 如果未找到记录或查询失败，返回空字符串
}

// 通过id向数据库中插入离开时间
void MySQL::insertLeveTime(QString id)
{
    QSqlQuery query;
    // 构造 SQL 语句，使用 NOW() 函数获取当前时间
    QString update_sql = "UPDATE students SET end_time = datetime('now', 'localtime') WHERE id = :id";
    query.prepare(update_sql);

    // 将 QString 类型的 id 转换为 int 类型
    bool ok;
    int intId = id.toInt(&ok);
    if (ok) {
        // 显式指定参数类型为 QVariant::Int
        query.bindValue(":id", QVariant(intId));
    } else {
        qDebug() << "ID 转换为整数失败，ID: " << id;
        return;
    }

    if (query.exec()) {
        if (query.numRowsAffected() > 0) {
            qDebug() << "成功插入离开时间，ID: " << id;
        } else {
            qDebug() << "未找到对应的记录，ID: " << id;
        }
    } else {
        qDebug() << "插入离开时间失败，错误信息: " << query.lastError().text();
    }
}

// 删除 students 表中所有数据的函数
void MySQL::deleteAllStudents()
{
    QSqlQuery query;
    QString delete_sql = "DELETE FROM students";
    if (query.exec(delete_sql)) {
        qDebug() << "成功删除 students 表中的所有数据";
    } else {
        qDebug() << "删除数据失败，错误信息: " << query.lastError().text();
    }
}

void MySQL::exportDataToExcel(const QString& excelFilePath) {
    // 获取数据库中所有学生信息
    std::vector<Student> allStudents = getAllStudents();

    // 创建 ExcelHelper 对象
    ExcelHelper excelHelper;

    // 打开 Excel 文件（如果文件不存在，会创建一个新的工作簿）
    excelHelper.open(excelFilePath);

    // 添加表格标题
    excelHelper.addTitle(excelFilePath);

    // 添加学生信息数据
    excelHelper.addInfos(excelFilePath, allStudents);

    // 关闭 Excel 文件
    excelHelper.close();

    qDebug() << "数据已成功导出到 Excel 文件：" << excelFilePath;
}

std::vector<Student> MySQL::getAllStudents() {
    std::vector<Student> students;
    QSqlQuery query("SELECT id, name, start_time, end_time FROM students", db);
    while (query.next()) {
        int id = query.value(0).toInt();
        QString name = query.value(1).toString();
        QDateTime start = query.value(2).toDateTime();
        QDateTime end = query.value(3).toDateTime();
        students.emplace_back(id, name, start, end);
    }
    return students;
}
